# Q. Топология сети

n = int(input())
dr=  [0]          # список смежных вершин

for i in range(1, n+1):
    dr.append([])
    
for i in range(n-1):
    x, y = list(map(int, input().split()))
    dr[x].append(y)
    dr[y].append(x)

def calc_d(sv):
    # считаем расстояния от произвольной вершины "sv" до остальных
    # возращаем самую дальнюю и расстояние до нее
    pv = [0] * (n+1)  # work list
    st = [sv]
    max_d = 0
    while len(st) > 0:
        i = st[0]
        for v in dr[i]:
            if pv[v] == 0 and v != sv:
                pv[v] = pv[i] + 1
                if max_d < pv[v]:
                    max_d = pv[v]
                    max_i = v # индекс в "pv" = номер вершины
                st.append(v)
        st.pop(0)
        
    return max_i, max_d

def route(fv, ev):
    # находим маршрут от "fv" до "ev", используя поиск в глубину
    pv = [0] * (n+1)
    st = [fv]
    while len(st) > 0:
        v = st[-1]
        pv[v] = 1
        if ev in dr[v]:
            st.append(ev)
            break
        for i in dr[v]:
            if pv[i] == 0:
                st.append(i)
                break
        else:
            st.pop()  
    return st

def calc_dsv(fv, stopv):
    # считаем расстояния от края маршрута = "fv" до остальных вершин,
    # но не заходя за "stopv" возращаем максимальное расстояние от "fv"
    pv = [0] * (n+1)  # work list
    st = [fv]
    mz = 0
    while len(st) > 0:
        i = st[0]
        for v in dr[i]:
            if v == stopv or v == fv:
                continue
            if pv[v] == 0:
                pv[v] = pv[i] + 1
                if mz < pv[v]:
                    mz = pv[v]
                st.append(v)
        st.pop(0)
        
    return mz
    
fp, fd = calc_d(1)
sp, fd = calc_d(fp)
#print(f"D = {fd} from {sp} to {fp}")

# нашли максимальный диаметр графа и
# подозреваем, что искомые точки находятся на маршруте от "sp" до "fp"

st = route(sp, fp)
h1 = st[0]
h2 = st[1]

# ищем нужные точки на маршруте

if len(st) > 3:
    
    half = (len(st) + 1) // 2
    #print(f"{half = }  route =", *st)

    d1 = calc_dsv(st[0], st[half])
    r1 = (d1 + 1) // 2
    h1 = st[r1]
    #print(f"{d1 = } {r1 = } {h1 = }")

    d2 = calc_dsv(st[-1], st[half-1])
    r2 = (d2 + 1) // 2
    h2 = st[-1 - r2]

print(h1, h2)

# empty string
